#include<iostream>
#include<cassert>
#include<unistd.h>
#include<signal.h>
#include<cstring>
using namespace std;

static void PrintPending(const sigset_t &pending)
{
    cout<<"当前进程的pe:";
    for(int signo=1;signo<=32;signo++)
    {
        if(sigismember(&pending,signo))cout<<"1";
        else cout<<"0";
    }
    cout<<"\n";
}
static void handler(int signo)
{
    cout<<"对特定信号"<<signo<<"执行捕捉动作"<<endl;

}
int main()
{
    struct sigaction act,oldact;
    memset(&act,0,sizeof(act));
    memset(&oldact,0,sizeof(oldact));
    act.sa_handler=handler;
    act.sa_flags=0;
    sigaction(2,&act,&oldact);
    while(true)
    {
        sleep(1);
    }
    return 0;
}
int main1()
{
    //1.屏蔽2号信号
    sigset_t set,oset;
    //1.1初始化
    sigemptyset(&set);
    sigemptyset(&oset);
    //1.2将2号新号添加到set中
    sigaddset(&set,SIGINT);
    //1.3将新的新号屏蔽字设置进程
    sigprocmask(SIG_BLOCK,&set,&oset);
    //2.while获取进程的pending信号集合，并01打印
    int cnt =0;
    //2.0对设置2号信号的自定义捕捉
    signal(2,handler);
    while(true)
    {    
        //2.1先获取pending信号集
        sigset_t pending;
        sigemptyset(&pending);
        int n=sigpending(&pending);
        assert(n==0);
        (void)n;//保证不会出现编译器的warning
        //2.2打印,方便我们查看
        PrintPending(pending);
        //2.3休眠一下
        sleep(1);

        //2.4 10s之后，恢复对所有信号的block动作
        if(cnt++==10)
        {
            cout<<"解除对2号新号的屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);

        }
    }
    return 0;
}